package estacion.acciones;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import com.opensymphony.xwork2.ActionSupport;

import estacion.dominio.Autobus;
import estacion.dominio.Conductor;
import estacion.dominio.Estacion;
import estacion.dominio.Linea;
import estacion.dominio.Persona;
import estacion.dominio.Revisor;
import estacion.dominio.Taxi;
import estacion.dominio.Tienda;
import estacion.dominio.Tramo;
import estacion.dominio.Tren;
import estacion.dominio.Vehiculo;
import estacion.dominio.Vendedor;

public class LineasyTramos extends ActionSupport{
	private static final long serialVersionUID = 1L;
	
	private boolean linea_anadida;
	private boolean tramo_anadido;
	private boolean linea_eliminada;
	
	private int operacion;
	
	private int cod_linea, cod_tramo;
	private String nombre_linea;
	
	private String tipo_vehiculo;
	private int duracion;
	private String estacion_origen;
	private String estacion_destino;
		
	private Linea line;
	private Tramo tram;

	private boolean anterior_diferente;
	private boolean duracion_negativa;
	private boolean tramos_iguales;
	private boolean nombre_vacio;
	private boolean existe_nombre;
	private boolean inicios_iguales;

	@Override
	public String execute() throws Exception {
		line = new Linea();
		tram = new Tramo();

		tramo_anadido = false;
		linea_anadida = false;
		linea_eliminada = false;
		anterior_diferente = false;
		duracion_negativa = false;
		tramos_iguales = false;

		if(this.operacion==Constantes.ANATRAMO){
			Linea l = new Linea();
			l = l.consultarLinean(this.getNombre_linea());
			this.setCod_linea(l.getCodigo_linea());
			this.setNombre_linea(nombre_linea);
			int num_tramos = tram.consultarTramos(cod_linea)+1;
			this.setCod_tramo(num_tramos);
			this.anadirTramo();				
		}
		else if(this.operacion==Constantes.ANALINEA){
			this.anadirLinea();
		}
		else if(this.operacion==Constantes.ELIMINAR){
			this.eliminarLinea();
		}

		return SUCCESS;
	}
	
	public void anadirTramo() throws Exception{
		Linea l = new Linea();
		Estacion e = new Estacion();
		Tramo primer_tramo = new Tramo();
		int cod_tram_ant = this.getCod_tramo()-1;
		
		//No coincide la estacion de origen con la estacion de destino del tramo anterior
		if(!this.getEstacion_origen().equals(this.getEstacion_destino())){
			//Duracion de recorrido mayor que 0
			if(this.getDuracion()>0){
				//Si no hay un tramo anterior, es el primer tramo a introducir
				if(tram.consultarTramo(cod_tram_ant, this.getCod_linea()) == null){
					//ESTACIONES
					if(e.consultarEstacion(this.getEstacion_origen()) != null && e.consultarEstacion(this.getEstacion_destino()) != null){
						tram.setParada_origen(this.getEstacion_origen());
						tram.setParada_destino(this.getEstacion_destino());
						l = l.consultarLinean(this.getNombre_linea());
						tram.setCodigo_linea(l.getCodigo_linea());
						tram.setCodigo_tramo(this.getCod_tramo());
						tram.setDuracion_recorrido(this.getDuracion());
						tram.insertarTramo();
						tramo_anadido = true;
					}
				}
				//Si se han introducido tramos antes
				else{
					tram = tram.consultarTramo(cod_tram_ant, this.getCod_linea());
					primer_tramo = primer_tramo.consultarTramo(1, this.getCod_linea());
					//Comprueba que la parada destino del tramo anterior coincida con la de origen del tramo a introducir
					if(tram.getParada_destino().equals(this.getEstacion_origen()) && e.consultarEstacion(this.getEstacion_destino()) != null){
						//ESTACIONES
						if(e.consultarEstacion(this.getEstacion_origen()) != null && e.consultarEstacion(this.getEstacion_destino()) != null){
							//Si el origen del primer tramo no coincide con el destino del tramo actual (linea circular)
							if(!primer_tramo.getParada_origen().equals(this.getEstacion_destino())){
								l = l.consultarLinean(this.getNombre_linea());
								tram.setParada_origen(this.getEstacion_origen());
								tram.setParada_destino(this.getEstacion_destino());
								tram.setCodigo_linea(l.getCodigo_linea());
								tram.setCodigo_tramo(this.getCod_tramo());
								tram.setDuracion_recorrido(this.getDuracion());
								tram.insertarTramo();
								tramo_anadido = true;
							}else inicios_iguales = true;
						}
					}else anterior_diferente = true;
				}
			}else duracion_negativa = true;
		}else tramos_iguales = true;
	}
	
	public void anadirLinea() throws Exception{
		Linea l = new Linea();
		
		if(l.consultarLinean(this.getNombre_linea()) == null){		
			if(!this.getNombre_linea().equals("")){
				line.setCodigo_linea(this.getCod_linea());
				line.setnombre(this.getNombre_linea());
				line.insertarLinea();
				linea_anadida = true;
			}else nombre_vacio = true;	
		}
		else existe_nombre = true;
	}
	
	public void eliminarLinea() throws Exception{
		Linea l = new Linea();
		Tramo t = new Tramo();
		int num_tramos = 0;
		
		if(line.consultarLinean(this.getNombre_linea()) != null){
			l = line.consultarLinean(this.getNombre_linea());
						
			num_tramos = t.consultarTramos(l.getCodigo_linea());
			
			//Eliminar los tramos
			for(int i=0; i<=num_tramos;i++)	t.deleteTramo(i, l.getCodigo_linea());
			
			l.deleteLinea(l.getCodigo_linea());
			linea_eliminada = true;
			
		}
	}
	
	public int getCod_tramo() {
		return cod_tramo;
	}
	
	public void setCod_tramo(int cod_tramo) {
		this.cod_tramo = cod_tramo;
	}

	public int getDuracion() {
		return duracion;
	}

	public void setDuracion(int duracion) {
		
		this.duracion = duracion;
	}

	public int getCod_linea() {
		return cod_linea;
	}

	public void setCod_linea(int cod_linea) {
		this.cod_linea = cod_linea;
	}

	public void setOperacion(String oper){
		if (oper.equalsIgnoreCase("Anadir Tramo"))
			this.operacion = Constantes.ANATRAMO;
		else if (oper.equalsIgnoreCase("Anadir Linea"))
			this.operacion = Constantes.ANALINEA;
		else if (oper.equalsIgnoreCase("Cargar Linea"))
			this.operacion = Constantes.CARGAR;
		else if (oper.equalsIgnoreCase("Cargar Tramo"))
			this.operacion = Constantes.CARGARTRAMOS;
		else if (oper.equalsIgnoreCase("Eliminar linea"))
			this.operacion = Constantes.ELIMINAR;
	}
	

	public String getTipo_vehiculo() {
		return tipo_vehiculo;
	}

	public void setTipo_vehiculo(String tipo_vehiculo) {
		this.tipo_vehiculo = tipo_vehiculo;
	}

	public Linea getLine() {
		return line;
	}

	public void setLine(Linea line) {
		this.line = line;
	}

	public Tramo getTram() {
		return tram;
	}

	public void setTram(Tramo tram) {
		this.tram = tram;
	}

	public String getEstacion_origen() {
		return estacion_origen;
	}

	public void setEstacion_origen(String estacion_origen) {
		this.estacion_origen = estacion_origen;
	}

	public String getEstacion_destino() {
		return estacion_destino;
	}

	public void setEstacion_destino(String estacion_destino) {
		this.estacion_destino = estacion_destino;
	}

	public List<String> estaciones() throws Exception {
		Estacion e = new Estacion();
		List<Estacion> aux = e.getEstaciones();
		List<String> estaciones = new ArrayList<String>();
		for(int i=0; i<aux.size();i++) estaciones.add(aux.get(i).getEstacion());
		
		return estaciones;
	}
	
	public ArrayList<String> tienda() throws Exception{
		Tienda tienda=new Tienda();
		Vendedor vend=new Vendedor();
		List<Persona> vends=vend.getPersonas();
		List<Tienda> tiendas=tienda.getTiendas();
		ArrayList<String >tie = new ArrayList<String>();
		tie.add("--");
		for(int k=0;k<tiendas.size();k++) tie.add(tiendas.get(k).getTipo_producto());
		for(int i=0;i<vends.size();i++){
			for(int j=0;j<tie.size();j++){
				if(tie.get(j).equals(tienda.consultTiendaporCodigo(((Vendedor) vends.get(i)).gettienda().getCodigo_Tienda()).getTipo_producto())){
					tie.remove(j);
				}
			}
		}
		return tie;
	}
	
	public ArrayList<String> linea() throws Exception{
		Linea linea=new Linea();
		Tramo t=new Tramo();
		Tren tr=new Tren();
		Autobus b=new Autobus();
		List<Vehiculo> trenes=tr.getVehiculos();
		List<Vehiculo> buses=b.getVehiculos();
		List<Linea> lineas=linea.getLineas();
		ArrayList<String> lin = new ArrayList<String>();
		lin.add("--");
		for(int i=0;i<lineas.size();i++){
			if(t.consultarTramos(lineas.get(i).getCodigo_linea())>0)lin.add(lineas.get(i).getnombre());
		}
		for(int i=0;i<trenes.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Tren)trenes.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		for(int i=0;i<buses.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Autobus)buses.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		return lin;
	}
	
	public ArrayList<String> li(){
		ArrayList<String> lic = new ArrayList<String>();
		lic.add("--");
		lic.add("tren");
		lic.add("taxi");
		lic.add("bus");
		return lic;
	}
	
	public ArrayList<String> vehiculos() throws Exception{
		Taxi taxi=new Taxi();
		Autobus autobus=new Autobus();
		Tren tren=new Tren();
		Conductor cond=new Conductor();
		List<Persona> conds=cond.getPersonas();
		Revisor rev=new Revisor();
		List<Persona> revs=rev.getPersonas();
		List<Vehiculo> taxis=taxi.getVehiculos();
		List<Vehiculo> trenes=tren.getVehiculos();
		List<Vehiculo> autobuses=autobus.getVehiculos();
		ArrayList<String>veh = new ArrayList<String>();
		veh.add("--");
		for(int i=0;i<taxis.size();i++)	veh.add(taxis.get(i).getCodigo_vehiculo());
		for(int i=0;i<trenes.size();i++)veh.add(trenes.get(i).getCodigo_vehiculo());
		for(int i=0;i<autobuses.size();i++)veh.add(autobuses.get(i).getCodigo_vehiculo());
		for(int i=0;i<conds.size();i++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))){
					veh.remove(j);
				}
			}
		}
		for(int i=0;i<revs.size();i++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Revisor) revs.get(i)).getTipo_vehiculo()))){
					veh.remove(j);
				}
			}
		}
		
		return veh;
	}
	
	public ArrayList<String> nombres_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) nombres.add(lineas.get(i).getnombre());
		
		return nombres;
	}
	
	public ArrayList<String> nombres_lineas_sin() throws Exception{
		Linea lin = new Linea();
		Tren t = new Tren();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++){
			if(t.consultarVehiculoLinea(lineas.get(i).getCodigo_linea()) == null){
				nombres.add(lineas.get(i).getnombre());
			}
		}
		
		return nombres;
	}
	
	public ArrayList<Integer> codigos_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<Integer> codigos = new ArrayList<Integer>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) codigos.add(lineas.get(i).getCodigo_linea());
		
		return codigos;
	}
	
	public String getNombre_linea() {
		return nombre_linea;
	}

	public void setNombre_linea(String nombre_linea) {
		this.nombre_linea = nombre_linea;
	}
	public List<Estacion> getEstaciones() throws Exception {
		Estacion e=new Estacion();
		return e.getEstaciones();
	}

	public boolean isLinea_anadida() {
		return linea_anadida;
	}

	public void setLinea_anadida(boolean linea_anadida) {
		this.linea_anadida = linea_anadida;
	}

	public boolean isTramo_anadido() {
		return tramo_anadido;
	}

	public void setTramo_anadido(boolean tramo_anadido) {
		this.tramo_anadido = tramo_anadido;
	}

	public boolean isLinea_eliminada() {
		return linea_eliminada;
	}

	public void setLinea_eliminada(boolean linea_eliminada) {
		this.linea_eliminada = linea_eliminada;
	}

	public boolean isAnterior_diferente() {
		return anterior_diferente;
	}

	public void setAnterior_diferente(boolean anterior_diferente) {
		this.anterior_diferente = anterior_diferente;
	}

	public boolean isDuracion_negativa() {
		return duracion_negativa;
	}

	public void setDuracion_negativa(boolean duracion_negativa) {
		this.duracion_negativa = duracion_negativa;
	}

	public boolean isTramos_iguales() {
		return tramos_iguales;
	}

	public void setTramos_iguales(boolean tramos_iguales) {
		this.tramos_iguales = tramos_iguales;
	}

	public boolean isNombre_vacio() {
		return nombre_vacio;
	}

	public void setNombre_vacio(boolean nombre_vacio) {
		this.nombre_vacio = nombre_vacio;
	}

	public boolean isExiste_nombre() {
		return existe_nombre;
	}

	public void setExiste_nombre(boolean existe_nombre) {
		this.existe_nombre = existe_nombre;
	}

	public boolean isInicios_iguales() {
		return inicios_iguales;
	}

	public void setInicios_iguales(boolean inicios_iguales) {
		this.inicios_iguales = inicios_iguales;
	}
	
}